// ! 使用核心函数 NestFactory 创建 Nest 应用实例的应用入口文件

import { NestFactory } from "@nestjs/core";
import { ValidationPipe } from "@nestjs/common";
import { NestExpressApplication } from "@nestjs/platform-express";
import { WsAdapter } from "@nestjs/platform-ws";
import { IoAdapter } from "@nestjs/platform-socket.io";
import { AppModule } from "./app.module";
import { HttpExceptionFilter } from "./common/http-exception.filter";
import { ResponseInterceptor } from "./common/response.interceptor";
import { AuthGuard } from "./guards/auth.guard";
import { join } from "path";
import * as express from "express";

async function bootstrap() {
  // const app = await NestFactory.create(AppModule);
  // 一般来说我们选择 NestExpress ，别问为什么 因为网上对这方面的资源多，出bug好找解决方案，而且官方文档有很多例子都是 Express来说的
  const app = await NestFactory.create<NestExpressApplication>(AppModule, {
    cors: true, // cors 处理跨域 或者直接 app.enableCors();
    // logger: ["error", "warn"], // 启用日志 禁用为false 数组中的值可以是 'log'、'fatal'、'error'、'warn'、'debug' 和 'verbose' 的任意组合
  });
  // 可以直接访问文件 如：http://localhost:3000/public/uploads/36T4NJ0P3UQCIU3GFRMARZ.jpeg
  // 配置 public 文件夹为静态目录，以达到可直接访问下面文件的目的
  const rootDir = join(__dirname, "..");
  app.use("/public", express.static(join(rootDir, "public")));
  // 注册全局过滤器处理HTTP异常
  app.useGlobalFilters(new HttpExceptionFilter());
  // 注册全局成功响应拦截器
  app.useGlobalInterceptors(new ResponseInterceptor());
  // ValidationPipe 使用 class-validator npm包及其声明式验证装饰器。  https://nest.nodejs.cn/techniques/validation
  app.useGlobalPipes(new ValidationPipe());
  // 注册全局守卫 执行在 拦截器 之前 执行在 中间件 之后
  app.useGlobalGuards(new AuthGuard());
  // 反过来充当框架和集成快速且经过全面测试的 ws 库之间的代理  https://nest.nodejs.cn/websockets/adapter
  app.useWebSocketAdapter(new WsAdapter(app));
  // 端口号 3000 启动 !
  await app.listen(3000);
}
bootstrap();
